//引入TokenStream, TokenTree, quote, syn等宏和库
//其中TokenStream的作用是生成和解析Token流，用于宏的定义和处理。
use proc_macro::{TokenStream, TokenTree};
use quote::quote;
//引入parse_macro_input, ItemFn等宏和库
//其中parse_macro_input用于解析宏输入，fnItemFn表示一个函数项，LitStr表示字符串字面量。
use syn::{parse_macro_input, ItemFn};

//基于这个类属性宏，那么函数可以这样引用 #[route(GET,"/")]
#[proc_macro_attribute]
pub fn route(attr: TokenStream, fn_item: TokenStream) -> TokenStream {
    // 解析属性参数
    let mut method = String::new();
    let mut path = String::new();
    
    for token in attr.clone() {
        match token {
            TokenTree::Literal(lit) => {
                // 假设第二个参数是路径
                path = lit.to_string().trim_matches('"').to_string();
            }
            TokenTree::Ident(ident) => {
                // 假设第一个参数是HTTP方法
                method = ident.to_string();
            }
            _ => {}
        }
    }

    // 解析原始函数
    let input_fn = parse_macro_input!(fn_item as ItemFn);
    let fn_name = &input_fn.sig.ident;
    let fn_block = &input_fn.block;
    let fn_vis = &input_fn.vis;
    let fn_sig = &input_fn.sig;

    // 生成新的代码
    let expanded = quote! {
        #fn_vis #fn_sig {
            println!(
                "Route registered - Method: {}, Path: {}, Function: {}",
                #method, #path, stringify!(#fn_name)
            );
            #fn_block
        }
    };

    TokenStream::from(expanded)
}